home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 06 - 1990 / 06.09 Sep 90 / LSObjectShell / StdMenus.p < prev    next >
Encoding:
Text File  |  1989-09-09  |  6.8 KB  |  313 lines  |  [TEXT/PJMM]

  1. UNIT StdMenus;
  2. {***********************************}
  3. INTERFACE
  4.  
  5.     USES
  6.         MemTypes, QuickDraw, OSIntf, ToolIntf, PackIntf, MacPrint, ObjIntf, GlobalStuff, AboutBox, StdWindows;
  7.  
  8.     TYPE
  9.         TMenu = OBJECT(TObject)
  10.                 fMenuHdl: MenuHandle;
  11.                 PROCEDURE Create (vRsrcID: Integer);
  12.                 PROCEDURE Choose (vItem: Integer);
  13.             END;
  14.  
  15.         TAppleMenu = OBJECT(TMenu)
  16.                 fAboutID: Integer;
  17.                 PROCEDURE Setup (vAlertID: Integer);
  18.                 PROCEDURE Create (vRsrcID: Integer);
  19.                 override;
  20.                 PROCEDURE Choose (vItem: Integer);
  21.                 override;
  22.             END;
  23.  
  24.         TFileMenu = OBJECT(TMenu)
  25.                 PROCEDURE Choose (vItem: Integer);
  26.                 override;
  27.             END;
  28.  
  29.         TEditMenu = OBJECT(TMenu)
  30.                 PROCEDURE Choose (vItem: Integer);
  31.                 override;
  32.             END;
  33.  
  34.     VAR
  35.         oAppleMenu: TAppleMenu;
  36.         oFileMenu: TFileMenu;
  37.         oEditMenu: TEditMenu;
  38.  
  39.     PROCEDURE InitStdMenus;
  40.     PROCEDURE ClickInStdMenus (vMenu, vItem: Integer);
  41.     PROCEDURE SetStdMenuItems;
  42.     PROCEDURE DisposeStdMenus;
  43.     PROCEDURE DoNew (vWindowKind: Integer;
  44.                                     vDocType: OSType);
  45.  
  46. {***********************************}
  47. IMPLEMENTATION
  48.  
  49.     PROCEDURE InitStdMenus;
  50.     BEGIN
  51.         New(oAppleMenu);
  52.         oAppleMenu.Setup(kAboutID);
  53.         oAppleMenu.Create(kAppleID);
  54.  
  55.         New(oFileMenu);
  56.         oFileMenu.Create(kFileID);
  57.  
  58.         New(oEditMenu);
  59.         oEditMenu.Create(kEditID);
  60.     END;    {InitStdMenus}
  61.  
  62. {========================================}
  63.     PROCEDURE ClickInStdMenus (vMenu, vItem: Integer);
  64.     BEGIN
  65.         CASE vMenu OF
  66.             kAppleID: 
  67.                 oAppleMenu.Choose(vItem);
  68.             kFileID: 
  69.                 oFileMenu.Choose(vItem);
  70.             kEditID: 
  71.                 oEditMenu.Choose(vItem);
  72.             OTHERWISE
  73.         END;
  74.     END;    {ClickInStdMenus}
  75.  
  76. {========================================}
  77.     PROCEDURE SetStdMenuItems;
  78.         VAR
  79.             vFrontWFlag: BOOLEAN;
  80.             vUserWFlag: BOOLEAN;
  81.             vMaxWFlag: BOOLEAN;
  82.  
  83.     BEGIN
  84.         vFrontWFlag := (FrontWindow <> NIL);
  85.         vUserWFlag := IsAppWindow(FrontWindow);
  86.         vMaxWFlag := NOT ((kMaxWindows <> 0) AND (gWCount = kMaxWindows));
  87.         SetEnable(kFileID, kNew, vMaxWFlag);
  88.         SetEnable(kFileID, kClose, vFrontWFlag);
  89.         SetEnable(kFileID, kSave, vUserWFlag);
  90.         SetEnable(kFileID, kSaveAs, vUserWFlag);
  91.         SetEnable(kFileID, kPrint, vUserWFlag);
  92.         SetEnable(kEditID, 0, vFrontWFlag);
  93.         IF vFrontWFlag AND NOT vUserWFlag THEN
  94.             BEGIN
  95.                 SetEnable(kEditID, kCut, TRUE);
  96.                 SetEnable(kEditID, kCopy, TRUE);
  97.                 SetEnable(kEditID, kPaste, TRUE);
  98.             END;
  99.     END;    {SetStdMenuItems}
  100.  
  101. {========================================}
  102.     PROCEDURE DisposeStdMenus;
  103.     BEGIN
  104.         oAppleMenu.Free;
  105.         oFileMenu.Free;
  106.         oEditMenu.Free;
  107.     END;    {DisposeStdMenus}
  108.  
  109. {========================================}
  110.     PROCEDURE TMenu.Create (vRsrcID: Integer);
  111.     BEGIN
  112.         HLock(Handle(Self));
  113.         fMenuHdl := GetMenu(vRsrcID);
  114.         InsertMenu(fMenuHdl, 0);
  115.         HUnlock(Handle(Self));
  116.     END; {Create}
  117.  
  118. {----------------------------------------}
  119.     PROCEDURE TMenu.Choose (vItem: Integer);
  120.     BEGIN
  121.     END; {Choose}
  122.  
  123. {========================================}
  124.     PROCEDURE TAppleMenu.Setup (vAlertID: Integer);
  125.     BEGIN
  126.         fAboutID := vAlertID
  127.     END; {Setup}
  128.  
  129. {----------------------------------------}
  130.     PROCEDURE TAppleMenu.Create (vRsrcID: Integer);
  131.     BEGIN
  132.         HLock(Handle(Self));
  133.         fMenuHdl := GetMenu(vRsrcID);
  134.         AddResMenu(fMenuHdl, 'DRVR');
  135.         InsertMenu(fMenuHdl, 0);
  136.         HUnlock(Handle(Self));
  137.     END; {Create}
  138.  
  139. {----------------------------------------}
  140.     PROCEDURE TAppleMenu.Choose (vItem: Integer);
  141.         VAR
  142.             vDAName: Str255;
  143.             vDANumber: Integer;
  144.             vSavePort: GrafPtr;
  145.  
  146.     BEGIN
  147.         IF vItem = kAbout THEN
  148.             DoAbout(fAboutID)
  149.         ELSE
  150.             BEGIN
  151.                 GetPort(vSavePort);        {protect against DA}
  152.                 GetItem(fMenuHdl, vItem, vDAName);
  153.                 vDANumber := OpenDeskAcc(vDAName);
  154.                 SetPort(vSavePort);
  155.             END;
  156.     END; {Choose}
  157.  
  158. {========================================}
  159.     PROCEDURE DoNew (vWindowKind: Integer;
  160.                                     vDocType: OSType);
  161.     BEGIN
  162.         CASE vWindowKind OF
  163.             kNoGrow: 
  164.                 New(TWindow(oWindow));
  165.             kGrow: 
  166.                 New(TGrowWindow(oWindow));
  167.             kHScroll..kScroll: 
  168.                 New(TScrollWindow(oWindow));
  169.             kHScrollZoom..kScrollZoom: 
  170.                 IF BitTst(Ptr(ROM85), 0) THEN
  171.                     New(TScrollWindow(oWindow))
  172.                 ELSE
  173.                     New(TScrollZoomWindow(oWindow));
  174.             OTHERWISE
  175.         END;
  176.         oWindow.fWKind := vWindowKind;
  177.         oWindow.DoNew(vDocType);
  178.         ShowWindow(oWindow.fWPtr);    {generates activate and update event}
  179.     END; {DoNew}
  180.  
  181. {----------------------------------------}
  182.     PROCEDURE DoOpen;
  183.         VAR
  184.             vPt: Point;
  185.             vNumTypes: Integer;
  186.             vTypeList: SFTypeList;
  187.             vReply: SFReply;
  188.             vWPeek: WindowPeek;
  189.  
  190.     BEGIN
  191.         CenterDialogBox(348, 200, vPt);
  192.         vNumTypes := 2;
  193.         vTypeList[0] := kPictDoc;
  194.         vTypeList[1] := kTextDoc;
  195.         SFGetFile(vPt, '', NIL, vNumTypes, vTypeList, NIL, vReply);
  196.         WITH vReply DO
  197.             IF good THEN
  198.                 BEGIN
  199.                     IF IsAppWindow(FrontWindow) THEN
  200.                         IF DuplicateFileName(FrontWindow, fName, vWPeek) THEN
  201.                             IF OSError(opWRErr) THEN
  202.                                 Exit(DoOpen);
  203.                     DoNew(kWindowKind, fType);
  204.                     oWindow.DoOpen(fName, vRefNum);
  205.                 END;
  206.     END; {DoOpen}
  207.  
  208. {----------------------------------------}
  209.     PROCEDURE DoClose;
  210.         VAR
  211.             vDANumber: Integer;
  212.  
  213.     BEGIN
  214.         IF IsAppWindow(FrontWindow) THEN
  215.             BEGIN
  216.                 oWindow := TWindow(GetWRefCon(FrontWindow));
  217.                 oWindow.DoClose;
  218.             END
  219.         ELSE
  220.             BEGIN
  221.                 vDANumber := WindowPeek(FrontWindow)^.windowkind;
  222.                 CloseDeskAcc(vDANumber);
  223.             END;
  224.     END; {DoClose}
  225.  
  226. {----------------------------------------}
  227.     PROCEDURE DoSave (vSaveAs: BOOLEAN);
  228.     BEGIN
  229.         oWindow := TWindow(GetWRefCon(FrontWindow));
  230.         IF oWindow.Saved(vSaveAs) THEN
  231.     END; {DoSave}
  232.  
  233. {----------------------------------------}
  234.     PROCEDURE DoPageSetup;
  235.         VAR
  236.             vFlag: BOOLEAN;
  237.  
  238.     BEGIN
  239.         PrOpen;
  240.         IF OSError(PrError) THEN
  241.             Exit(DoPageSetup);
  242.         SetCursor(arrow);
  243.         vFlag := PrValidate(gPrintHdl);
  244.         vFlag := PrStlDialog(gPrintHdl);
  245.         vFlag := OSError(PrError);
  246.         PrClose;
  247.         IF OSError(PrError) THEN
  248.     END; {DoPageSetup}
  249.  
  250. {----------------------------------------}
  251.     PROCEDURE DoPrint;
  252.         VAR
  253.             vFlag: BOOLEAN;
  254.  
  255.     BEGIN
  256.         oWindow := TWindow(GetWRefCon(FrontWindow));
  257.         PrOpen;
  258.         IF OSError(PrError) THEN
  259.             Exit(DoPrint);
  260.         SetCursor(arrow);
  261.         vFlag := PrValidate(gPrintHdl);
  262.         IF PrJobDialog(gPrintHdl) THEN
  263.             oWindow.DoPrint;
  264.         PrClose;
  265.         IF OSError(PrError) THEN
  266.     END; {DoPrint}
  267.  
  268. {----------------------------------------}
  269.     PROCEDURE DoQuit;
  270.     BEGIN
  271.         gQuitting := TRUE;
  272.         WHILE (FrontWindow <> NIL) AND gQuitting DO
  273.             DoClose;
  274.         IF gQuitting THEN
  275.             gDone := TRUE;
  276.     END; {DoQuit}
  277.  
  278. {----------------------------------------}
  279.     PROCEDURE TFileMenu.Choose (vItem: Integer);
  280.     BEGIN
  281.         CASE vItem OF
  282.             kNew: 
  283.                 DoNew(kWindowKind, kDocKind);
  284.             kOpen: 
  285.                 DoOpen;
  286.             kClose: 
  287.                 DoClose;
  288.             kSave: 
  289.                 DoSave(FALSE);
  290.             kSaveAs: 
  291.                 DoSave(TRUE);
  292.             kPageSetUp: 
  293.                 DoPageSetup;
  294.             kPrint: 
  295.                 DoPrint;
  296.             kQuit: 
  297.                 DoQuit;
  298.         END;
  299.     END; {Choose}
  300.  
  301. {========================================}
  302.     PROCEDURE TEditMenu.Choose (vItem: Integer);
  303.     BEGIN
  304.         IF NOT SystemEdit(vItem - 1) THEN
  305.             IF FrontWindow <> NIL THEN
  306.                 BEGIN
  307.                     oWindow := TWindow(GetWRefCon(FrontWindow));
  308.                     oWindow.Edit(vItem);
  309.                 END;
  310.     END; {Choose}
  311.  
  312. END. {unit StdMenus}
  313. {***********************************}